package client.view;


import java.io.DataOutputStream;

import java.io.IOException;
import java.net.Socket;
import java.util.Hashtable;
import com.google.gson.Gson;
import client.main.Client_main;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import model.Message;
import model.MsgType;

public class FriendRequestPage extends Stage {
    private ObservableList<FriendRequest> friendRequests = FXCollections.observableArrayList();
    private Hashtable<Integer, String> addmessage;
    
    public FriendRequestPage(Hashtable<Integer, String> addmes,int myaccount) {
    	this.addmessage = addmes; 
    	System.out.println("初始化FriendPage");
    	
        for(Integer i : addmes.keySet()) {
        	System.out.println("正在添加："+addmes.get(i));
        	FriendRequest friendRequest = new FriendRequest(addmes.get(i), i);
        	friendRequests.add(friendRequest);
        }
        
        // 创建一个表格用于显示好友申请信息
        TableView<FriendRequest> table = new TableView<>();
        table.setEditable(false);

        // 创建表格列并绑定到 FriendRequest 类中的属性
        TableColumn<FriendRequest, String> nameCol = new TableColumn<>("用户名");
        nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
        nameCol.setPrefWidth(150); // 10 个中文字符的宽度
        TableColumn<FriendRequest, String> idCol = new TableColumn<>("QQ号");
        idCol.setCellValueFactory(new PropertyValueFactory<>("account"));
        idCol.setPrefWidth(100); // 10 个数字的宽度

        table.getColumns().addAll(nameCol, idCol);
        // 将 friendRequests 列表绑定到表格中
        table.setItems(friendRequests);

        // 创建一个按钮用于同意好友申请
        Button acceptBtn = new Button("同意");

        // 为按钮添加事件处理程序
        acceptBtn.setOnAction(event -> {
            // 获取选中的好友申请
            FriendRequest selectedRequest = table.getSelectionModel().getSelectedItem();
            if (selectedRequest == null) {
                // 如果没有选中任何一行，则弹出警示框提示用户需要先选中一行
                Alert alert = new Alert(AlertType.WARNING);
                alert.setTitle("警告");
                alert.setHeaderText(null);
                alert.setContentText("请先选中一行！");
                alert.showAndWait();
                return;
            }
            // 解析好友申请信息
            String qqName = selectedRequest.getName();   //申请人的昵称
            int account = selectedRequest.getAccount();              
            try {
            	Socket client = new Socket(Client_main.ip, 12345);
            	DataOutputStream output = new DataOutputStream(client.getOutputStream());
            	
            	 Message retmes = new Message();
                 retmes.setType(MsgType.ADD_ACCEPTED);
                 retmes.setUserID(myaccount);
                 retmes.setText(qqName);
                 retmes.setRoomID(account);    //复用roomId传输申请人的账号
                 
                 Gson gson = new Gson();
                 String json = gson.toJson(retmes);
                 output.writeUTF(json);
                 output.close();
                 client.close();
            	 
            }catch (IOException e) {
				// TODO: handle exception
            	e.printStackTrace();
            }

            addmessage.remove(account);
            
            // 从列表中移除已处理的好友申请
            friendRequests.remove(selectedRequest);
        });

        // 创建一个按钮用于拒绝好友申请
        Button rejectBtn = new Button("拒绝");
        // 为按钮添加事件处理程序
        rejectBtn.setOnAction(event -> {
            // 获取选中的好友申请
            FriendRequest selectedRequest = table.getSelectionModel().getSelectedItem();
           if (selectedRequest == null) {
                // 如果没有选中任何一行，则弹出警示框提示用户需要先选中一行
                Alert alert = new Alert(AlertType.WARNING);
                alert.setTitle("警告");
                alert.setHeaderText(null);
                alert.setContentText("请先选中一行！");
                alert.showAndWait();
                return;
            }
            // 解析好友申请信息
            String qqName = selectedRequest.getName();
            int account = selectedRequest.getAccount();        
            try {
            	Socket client = new Socket(Client_main.ip, 12345);
            	DataOutputStream output = new DataOutputStream(client.getOutputStream());
            	
            	 Message retmes = new Message();
                 retmes.setType(MsgType.ADD_REJECTED);
                 retmes.setUserID(myaccount);
                 retmes.setText(qqName);
                 retmes.setRoomID(account);    //复用roomId传输申请人的账号
                 
                 Gson gson = new Gson();
                 String json = gson.toJson(retmes);
                 output.writeUTF(json);
                 output.close();
                 client.close();
            	 
            }catch (IOException e) {
				// TODO: handle exception
            	e.printStackTrace();
            }

            addmessage.remove(account);
            
            // 从列表中移除已处理的好友申请
            friendRequests.remove(selectedRequest);
            
        });
        // 创建一个水平布局，用于放置同意和拒绝按钮
        HBox btnBox = new HBox();
        btnBox.setSpacing(10); // 设置按钮之间的间距

        // 将同意和拒绝按钮添加到水平布局中
        btnBox.getChildren().addAll(acceptBtn, rejectBtn);

        // 创建一个垂直布局，并将表格和按钮添加到其中
        VBox root = new VBox();
        root.getChildren().addAll(table, btnBox);

        Scene scene = new Scene(root, 400, 300);
        this.setScene(scene);
        this.setTitle("好友申请");
        this.show();
    }

    // 定义 FriendRequest 类，用于存储好友申请信息
    public static class FriendRequest {
        private final String name;
        private final int account;

        public FriendRequest(String name, int qqaccount) {
            this.name = name;
            this.account = qqaccount;
        }

        public String getName() {
            return name;
        }

        public int getAccount() {
            return account;
        }

        @Override
        public String toString() {
            return name + "(" + account + ")";
        }
    }
}